import os
import subprocess
import sys
import os
import time

# 设置工作目录为当前目录
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

# 安装依赖
def install_dependencies():
    """安装项目依赖"""
    print("正在检查并安装依赖...")
    
    # 首先检查pydantic版本
    try:
        import pydantic
        from packaging import version
        pydantic_version = version.parse(pydantic.__version__)
        required_version = version.parse("2.9.2")
        if pydantic_version < required_version:
            print(f"检测到pydantic版本 {pydantic.__version__} 低于要求的 2.9.2，需要更新")
        else:
            print(f"pydantic版本 {pydantic.__version__} 满足要求")
    except ImportError:
        print("未检测到pydantic，需要安装")
    
    # 检查是否已安装openai-whisper
    try:
        import whisper
        print("openai-whisper 已安装")
    except ImportError:
        print("openai-whisper 未安装")
    
    # 使用清华PyPI镜像源安装依赖
    requirements_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'requirements_whisper.txt')
    
    try:
        # 确保pip是最新版本
        print("正在更新pip...")
        subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip', '-i', 'https://pypi.tuna.tsinghua.edu.cn/simple'])
        
        # 安装依赖
        print(f"正在安装依赖 (使用requirements_whisper.txt)...")
        install_cmd = [
            sys.executable, '-m', 'pip', 'install', '-r', requirements_path, 
            '-i', 'https://pypi.tuna.tsinghua.edu.cn/simple',
            '--upgrade'
        ]
        
        # 打印命令以便用户了解
        print(f"执行命令: {' '.join(install_cmd)}")
        subprocess.check_call(install_cmd)
        
        print("依赖安装成功！")
        return True
    except subprocess.CalledProcessError as e:
        print(f"依赖安装失败: {e}")
        print("尝试单独安装关键依赖...")
        
        # 尝试单独安装关键依赖
        try:
            print("尝试单独安装pydantic>=2.9.2...")
            subprocess.check_call([
                sys.executable, '-m', 'pip', 'install', 'pydantic>=2.9.2', 
                '-i', 'https://pypi.tuna.tsinghua.edu.cn/simple'
            ])
            
            print("尝试单独安装openai-whisper>=20231117...")
            subprocess.check_call([
                sys.executable, '-m', 'pip', 'install', 'openai-whisper>=20231117', 
                '-i', 'https://pypi.tuna.tsinghua.edu.cn/simple'
            ])
            
            print("尝试单独安装fastapi和uvicorn...")
            subprocess.check_call([
                sys.executable, '-m', 'pip', 'install', 'fastapi==0.100.0', 'uvicorn==0.23.2', 
                '-i', 'https://pypi.tuna.tsinghua.edu.cn/simple'
            ])
            
            print("关键依赖安装成功！")
            return True
        except subprocess.CalledProcessError as e2:
            print(f"关键依赖安装失败: {e2}")
            print("\n建议手动安装依赖：")
            print(f"pip install -r {requirements_path} -i https://pypi.tuna.tsinghua.edu.cn/simple")
            print("\n如果仍然失败，可以尝试：")
            print("pip install pydantic>=2.9.2 openai-whisper>=20231117 fastapi==0.100.0 uvicorn==0.23.2 -i https://pypi.tuna.tsinghua.edu.cn/simple")
            return False

# 启动服务
def start_server():
    """启动FastAPI服务"""
    print("开始启动服务...")
    
    # 构建启动命令
    server_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'main_whisper.py')
    
    # 不需要更改工作目录，因为脚本已经在正确的目录下
    
    # 启动uvicorn服务
    try:
        print(f"正在启动服务，使用文件: {server_file}")
        print("服务将在 http://0.0.0.0:8000 启动")
        print("API文档可在 http://0.0.0.0:8000/docs 查看")
        print("按 Ctrl+C 停止服务")
        
        # 使用subprocess启动服务，这样用户可以看到输出
        subprocess.run([sys.executable, '-m', 'uvicorn', 'main_whisper:app', '--host', '0.0.0.0', '--port', '8000'])
    except KeyboardInterrupt:
        print("服务已停止")
    except Exception as e:
        print(f"服务启动失败: {e}")
        print("请尝试手动启动服务：uvicorn main_whisper:app --host 0.0.0.0 --port 8000")

# 主程序
if __name__ == "__main__":
    print("==== Kitten TTS 服务启动器 (使用OpenAI Whisper) ====")
    
    # 安装依赖
    if install_dependencies():
        # 短暂延迟，确保依赖安装完成
        time.sleep(1)
        # 启动服务
        start_server()
    else:
        print("无法安装依赖，服务启动失败")
        print("请检查您的网络连接或手动安装依赖")
        input("按Enter键退出...")